<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>每日笔记</title>
</head>
<body>

</body>
<script>
    //arguments类数组对象可以直接循环
    //arguments和function是分不开的
    //arguments大部分情况用于同个方法多次调用，但调用的参数不一样
    function f() {
        let i=0;
        for (let num of arguments){
            i+=num;
        }
        return i;
    }
    console.log(f(1,2,3,5,6,7));

    //函数作用域
    //底层可以向上级查看，调用层级数据，但顶层不能看到底层数据
    let a=1;  //全局作用域
    let b=2;
    console.log(a+b);//值为3
    function p() {
        let a=10;  //局部作用域
        let c =20;
        console.log('p'+a+b+c); //值为32
        function o(){
            let a=20;  //局部作用域
            let d=30;
            console.log('o'+a+b+c+d); //值为20+2+20+30=72
        }
    }

    //暂时性死区，除非像function那样存在变量提升，否则不能再定义之前使用
    //调用文件中如果都有相同的名字定义的变量和函数  ，那么先引用的那个会被之后的覆盖，因为代码的执行顺序是从上到下；


    //递归函数
    /*5 5 * num(4)  5*4*3*2*1
        4 * num(3)  4*3*2*1
        3 * num(2)  3*2*1
        2 * num(1) 2*1
    5*4*3*2*1
    跟循环有差别
     */
    function f1(num) {
        if(num<=1){
            return 1
        }
        else {
            return num*f1(num-1)
        }
    }
    console.log(f1(5))

    //return函数返回值
    let q;
    function f2(w,e) {
        return e+w;
    }
    q=f2(10,20)

    //闭包函数
    function f3() {
        let name ='123';
        return  function f4() {
            return name
        }
    }
    let num= f3()() //第二个（）调用他返回的内部函数（f4）
</script>
</html>